/*命名空间使用情况
    情况一：两个命名空间内变量名重复
        当两个命名空间中定义了同名的变量时，
        直接使用变量名会产生歧义。
        为了解决这个问题，
        我们需要通过命名空间名来区分变量。

    情况二：命名空间与全局变量冲突
        当命名空间中的变量与全局变量发生冲突时，
        通常使用作用域运算符 :: 来访问全局变量，避免歧义。
        这种方式我们称为 匿名空间 或者 域调用

    情况三：命名空间与局部变量冲突
        当命名空间中的变量与局部变量发生冲突时，
        程序会优先使用局部变量。
        此时，可以通过命名空间名来明确使用命名空间中的变量。
*/

#include <iostream>
using namespace std;
using int32 = int;//类似于typedef
namespace Y
{
    int a = 100;
    char name[20];
    void show()
    {
        int i=0;
        cout << "作用域Y：" << endl;
        cin >> i ;
        cout << i << endl;
    }

    //嵌套命名空间
    namespace C
    {
        int a = 800;
        void show()
        {
            cout << "嵌套命名空间" << endl;
        }
    }
}

//C++中名字域是开放的
namespace Y
{
    int b = 100;
}

namespace Z
{
    int a = 200;
    char name[20];
    void show()
    {
        int i=0;
        cout << "作用域Z：" << endl;
        cin >> i ;
        cout << i << endl;
    }
}

//C++中四种域的概念：全局作用域，局部作用(语句块，函数域)，名字域，类域
int main(int argc,char const *argv[])
{
    /*
    使用指定名字域中的函数或变量时，
    使用域名解析运算符::解析到指定域中
    */
    cout << Y::a << endl;
    cout << Z::a << endl;
    Y::show();
    Y::show();

    //嵌套命名空间
    //嵌套的命名空间的要使用的域名解析符逐级访问。
    cout << Y::C::a << endl;
    Y::C::show();
    //cout << "------------------------------------" << endl;
    //using namespace Y;
    //cout << a << endl;
    //show();
    return 0;
}